<?php
/**
 * @author jonathan <jo.link.noir@gmail.com>
 * @version 1.0: jo_link_noir
 * @date 26-05-2010
 */
abstract class SW_DAO
{
	/** @var PDO */
	static protected $db;

	/** @var array : {PDOStatement, …}*/
	static protected $queries = array();

	/**
	 * Initialise pdo pour qu'il lance des exceptions
	 * @param PDO $db
	 */
	static public function setDb(PDO $db)
	{
		$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		self::$db = $db;
	}

	/**
	 * @return PDO
	 */
	static public function getDb()
	{
		return self::$db;
	}

	/**
	 * @return array : {$key => PDOStatement, ...}
	 */
	static public function getQueries()
	{
		return self::$queries;
	}

	/**
	 * Retourne un tableau de tableau qui contient la requête et un tableau d'information sur l'erreur
	 * @return array : {querie, {code_erreur_SQLSTATE, code_erreur_driver, message_driver}}
	 */
	static public function getQueriesInfo()
	{
		$queries = array();
		foreach(self::$queries as $k => $query)
			$queries[$k] = array($query->queryString, $query->errorInfo());
		return $queries;
	}


	/** @var PDO*/
	protected $pdo;


	/**
	 * @param PDO $pdo = null : si null alors = self::getDB()
	 */
	protected function __construct(PDO $pdo = null)
	{
		$this->pdo	= $pdo ? $pdo : self::getDB();
	}

	/**
	 * prépare la reqûete en la mettant dans self::$queries
	 * @code
		self::$queries[$method] = $this->pdo->prepare($query);
	 * @endcode
	 */
	final protected function prepare($method, $query)
	{
		self::$queries[$method] = $this->pdo->prepare($query);
	}
}

/*
 * Classe simple pour itérer sur un objet PDOStatement. Cette classe est à utilisé dans un foreach est retourne un objet StdObject avec les noms de champs d'une requete
 */
// class SW_DAO_Iterator Implements Iterator
// {
// 	/** @var PDOStatement*/
// 	protected $_pdo_statement;
// 	/** @var StdObject|false*/
// 	protected $_current = NULL;
// 	/** @var StdObject|false*/
// 	protected $_iteration = 0;
//
//
// 	/**
// 	 * @param PDOStatement $sth
// 	 */
// 	public function __construct(PDOStatement $sth)
// 	{
// 		$this->_pdo_statement = $sth;
// 	}
//
// 	/**
// 	 * @return PDOStatement
// 	 */
// 	public function getPDOStatement()
// 	{
// 		return $this->_pdo_statement;
// 	}
//
// 	/**
// 	 * @return bool
// 	 */
// 	public function valid()
// 	{
// 		return false !== $this->_current;
// 	}
//
// 	/**
// 	 * @code
// 	 * $this->_current = $this->_pdo_statement->fetchObject()
// 	 * ++$this->_iteration;
// 	 * @endcode
// 	 */
// 	public function next()
// 	{
// 		$this->_current = $this->_pdo_statement->fetchObject();
// 		++$this->_iteration;
// 	}
//
// 	/**
// 	 * Lance une excepion si on y appel une seconde fois
// 	 */
// 	public function rewind()
// 	{
// 		if (NULL !== $this->_current)
// 			throw new SW_DAO_Exception('SW_DAO_Iterator ne peut pas être réitérer');
// 		$this->_current = $this->_pdo_statement->fetchObject();
// 	}
//
// 	/**
// 	 * Retourne le nombre d'itération -1
// 	 * @return int
// 	 */
// 	public function key()
// 	{
// 		return $this->_iteration;
// 	}
//
// 	/**
// 	 * @return StdObject
// 	 */
// 	public function current()
// 	{
// 		return $this->_current;
// 	}
// }